package wq.gdky005.main.adapter;

import java.util.ArrayList;

import wq.gdky005.R;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class TestAdapter extends BaseAdapter {

	private Context context;
	private ArrayList<Object> list;
	private LayoutInflater inflater;

	public TestAdapter(Context context, ArrayList<Object> list) {
		super();
		this.context = context;
		this.list = list;
		inflater = LayoutInflater.from(context);
	}

	/**
	 * 可以在这里添加数据源的数据，和上面得到数据的方法不一样 wangqing 2013-6-5 void
	 */
	public void addItem() {

	}

	@Override
	public int getCount() {

		return 0;
	}

	@Override
	public Object getItem(int position) {

		return null;
	}

	@Override
	public long getItemId(int position) {

		return 0;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		HoldView holdView = null;
		if (convertView == null) {
			convertView = inflater.inflate(R.layout.test_item_layout, null);
			holdView = new HoldView();
			holdView.tv = (TextView) convertView.findViewById(R.id.tv);
			convertView.setTag(holdView);
		} else {
			holdView = (HoldView) convertView.getTag();
		}

		holdView.tv.setText("" + (position + 1));
		handleImage();

		return convertView;
	}

	// 针对图片处理要注意的地方
	private void handleImage() {
		/**
		 * 1.不要直接拿个路径就去循环decodeFile();这是找死….用Option保存图片大小、不要加载图片到内存去;
		 * 2.拿到的图片一定要经过边界压缩
		 * 3.在ListView中取图片时也不要直接拿个路径去取图片，而是以WeakReference（使用WeakReference代替强引用
		 * 。比如可以使 用WeakReference<Context> mContextRef）、SoftReference、WeakHashMap等的来存储图片信息，是图片信息不是图片哦！
		 * 
		 * 4.在getView中做图片转换时，产生的中间变量一定及时释放
		 * 5.尽量避免在BaseAdapter中使用static来定义全局静态变量，我以为这个没影响，这个影响很大，static是Java中的一个关键字，
		 * 当用它来修饰成员变量时，那么该变量就属于该类，而不是该类的实例。所以用static修饰的变量，
		 * 它的生命周期是很长的，如果用它来引用一些资源耗费过多的实例（比如Context的情况最多），这时就要尽量避免使用了
		 * 
		 * 6.如果为了满足需求下必须使用Context的话：Context尽量使用Application
		 * Context，因为Application的Context的生命周期比较长，引用它不会出现内存泄露的问题
		 * 
		 * 7.(参考)尽量避免在ListView适配器中使用线程，因为线程产生内存泄露的主要原因在于线程生命周期的不可控制
		 * 8.之前使用的自定义ListView中适配数据时使用AsyncTask自行开启线程的，
		 * 这个比用Thread更危险，因为Thread只有在run函数不结束时才出现这种内存泄露问题，
		 * 然而AsyncTask内部的实现机制是运用了线程执行池（ThreadPoolExcutor），看下小马上传的Gallery源码，你会对线程执行池、软、弱、强引用有个更深入的认识）,这个类产生的Thread对象的生命周期是不确定的
		 * ，是应用程序无法控制的，因此如果AsyncTask作为Activity的内部类，就更容易出现内存泄露的问题。
		 * 		解决办法是：
		 * 			6.1：将线程的内部类，改为静态内部类。
		 *			6.2：在线程内部采用弱引用保存Context引用
		 * 		@see WeakAsyncTask
		 */

	}

	/**
	 * 在适当的位置使用 wangqing 2013-6-5 void
	 */
	public void bitmapImage() {
		// 提醒：图片使用完后必须及时提醒系统回收
		String filePath = "file:///sd/abc.png";
		Bitmap bitmap = new BitmapFactory().decodeFile(filePath);

		// 及时回收内存
		if (!bitmap.isRecycled()) {
			bitmap.isRecycled(); // 回收图片所占的内存
			System.gc(); // 提醒系统及时回收
		}
	}

	class HoldView {
		private TextView tv;
	}

}
